package com.zhu.instructions.stack;

// instructions/stack/DUP2_X1.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;
import com.zhu.rtda.Slot;

/**
 * 指令：dup2_x1
 *
 * 操作数：无
 *
 * 功能：
 *  复制栈顶的两个变量（两个 slot），
 *  并插入到其下 1 个变量之下。
 *
 * 栈变化：
 *  ..., w, [v2, v1] → ..., [v2, v1], w, [v2, v1]
 *
 * 说明：
 *  - 弹出 v2, v1, w
 *  - 压入顺序：v1, v2, w, v1, v2
 *
 * 用途：
 *  某些需要保留 long/double 值并插入中间的场景。
 */
public class DUP2_X1 extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        Slot slot1 = stack.popSlot();  // v2
        Slot slot2 = stack.popSlot();  // v1
        Slot slot3 = stack.popSlot();  // w

        // 压回：[v2,v1], w, [v2,v1]
        stack.pushSlot(slot2);         // v1
        stack.pushSlot(slot1);         // v2
        stack.pushSlot(slot3);         // w
        stack.pushSlot(slot2);         // v1
        stack.pushSlot(slot1);         // v2（dup）
    }
}